package com.orderplus.opshop.common.util;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.LongSerializationPolicy;
import com.google.gson.reflect.TypeToken;
import com.orderplus.opshop.common.util.date.DateStyle;

/**
 * Title: GSON处理类
 * Description: 用于json之间的转换
 * Company: Copyright @ 2017 OrderPlus 版权所有
 *
 * @version 1.0 初稿
 * @author: 麦豪俊
 * @date: 2015-1-12 12:12:12
 */
public class GsonUtil {

	/**
	 * Description: 初始化GOSN参数
	 */
	public static Gson getGson() {
		Gson gson = new GsonBuilder()
				.enableComplexMapKeySerialization()                                    //支持Map的key为复杂对象的形式
//				.serializeNulls()													//序列化null字段,进行显示设置
				.setDateFormat(DateStyle.YYYY_MM_DD_HH_MM_SS.getValue())            //时间转化为特定格式
				.setPrettyPrinting()                                                //对json结果格式化.
				.setLongSerializationPolicy(LongSerializationPolicy.STRING)            //long数值不自动转换科学计数法
				.create();

		return gson;
	}

	/**
	 * Description: 初始化GOSN参数(对json结果不格式化)
	 */
	public static Gson getGsonNotFormat() {
		Gson gson = new GsonBuilder()
				.enableComplexMapKeySerialization()                                    //支持Map的key为复杂对象的形式
//				.serializeNulls()													//序列化null字段,进行显示设置
				.setDateFormat(DateStyle.YYYY_MM_DD_HH_MM_SS.getValue())            //时间转化为特定格式
				.setLongSerializationPolicy(LongSerializationPolicy.STRING)         //long数值不自动转换科学计数法
				.create();

		return gson;
	}

	/**
	 * Description: json字符串转换成对象
	 *
	 * @author: ronghua
	 * @date: 2014年11月20日上午10:32:48
	 */
	@SuppressWarnings({"rawtypes", "unchecked"})
	public static Object toObject(String json, Class cla) {
		if (ValueUtil.isEmpty(json)) {
			return null;
		}

		Gson gson = getGson();

		Object obj = gson.fromJson(json, cla);

		return obj;
	}

	/**
	 * Description: json字符串转换成对象
	 *
	 * @author: ronghua
	 * @date: 2014年11月20日上午10:32:48
	 */
	public static Object toObject(String json, Type type) {
		if (ValueUtil.isEmpty(json)) {
			return null;
		}

		Gson gson = getGson();

		Object obj = gson.fromJson(json, type);

		return obj;
	}

	/**
	 * Description: 将对象转换成 json字符串
	 *
	 * @author: ronghua
	 * @date: 2014年11月20日上午10:32:48
	 */
	public static String toString(Object obj) {
		if (ValueUtil.isEmpty(obj)) {
			return null;
		}

		Gson gson = getGson();

		String result = gson.toJson(obj);

		return result;
	}

	/**
	 * Description: 将对象转换成 json字符串  (不格式化)
	 */
	public static String toStringNotFormat(Object obj) {
		if (ValueUtil.isEmpty(obj)) {
			return null;
		}

		Gson gson = getGsonNotFormat();

		String result = gson.toJson(obj);

		return result;
	}

	/**
	 * 从 json字符串中获取指定值
	 * Description:
	 *
	 * @author: ronghua
	 * @date: 2015年11月20日上午10:32:48
	 */
	@SuppressWarnings("unchecked")
	public static String getValueFromJson(String key, String json) {
		if (ValueUtil.isEmpty(json)) {
			return null;
		}

		JsonValidator jv = new JsonValidator();
//		判断是否为json格式
		if (!jv.validJson(json)) {
			return null;
		}
		Map<String, String> map = (Map<String, String>) GsonUtil.toObject(json, new TypeToken<Map<String, String>>() {
		}.getType());
		if (map != null) {
			if (ValueUtil.isNotEmpty(map.get(key))) {
				return String.valueOf(map.get(key));
			}
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public static List<Map<String, Object>> toListMap(String json) {
		if (ValueUtil.isEmpty(json)) {
			return null;
		}
		JsonValidator jv = new JsonValidator();
//		判断是否为json格式
		if (!jv.validJson(json)) {
			return null;
		}
		List<Map<String, Object>> list = (List<Map<String, Object>>) GsonUtil.toObject(json, new TypeToken<List<Map<String, Object>>>() {
		}.getType());
		if (list != null) {
			return list;
		}

		return null;
	}

	/**
	 * 根据json字符串返回Map对象
	 *
	 * @param json
	 * @return
	 */
	public static Map<String, Object> toMap(String json) {
		Gson gson = getGson();

		Map<String, Object> result = gson.fromJson(json, new TypeToken<Map<String, Object>>() {
		}.getType());
		return result;
	}

	/**
	 * 获取JsonObject
	 *
	 * @param json
	 * @return
	 */
	public static JsonObject parseJson(String json) {
		JsonParser parser = new JsonParser();
		JsonObject jsonObj = parser.parse(json).getAsJsonObject();

		return jsonObj;
	}

	/**
	 * 将JSONObjec对象转换成Map-List集合
	 *
	 * @param json
	 * @return
	 */
	public static Map<String, Object> toMap(JsonObject json) {
		Map<String, Object> map = new HashMap<String, Object>();
		Set<Entry<String, JsonElement>> entrySet = json.entrySet();
		for (Iterator<Entry<String, JsonElement>> iter = entrySet.iterator(); iter.hasNext(); ) {
			Entry<String, JsonElement> entry = iter.next();
			String key = entry.getKey();
//            System.out.println("key: "+key);
			Object value = entry.getValue();
			if (value instanceof JsonArray) {
				map.put((String) key, toList((JsonArray) value));
			} else if (value instanceof JsonObject) {
				map.put((String) key, toMap((JsonObject) value));
			} else {
				map.put((String) key, value);
			}
		}
		return map;
	}

	/**
	 * 将JSONArray对象转换成List集合
	 *
	 * @param json
	 * @return
	 */
	public static List<Object> toList(JsonArray json) {
		List<Object> list = new ArrayList<Object>();
		for (int i = 0; i < json.size(); i++) {
			Object value = json.get(i);
			if (value instanceof JsonArray) {
				list.add(toList((JsonArray) value));
			} else if (value instanceof JsonObject) {
				list.add(toMap((JsonObject) value));
			} else {
				list.add(value);
			}
		}
		return list;
	}

	/**
	 * 将JSONArray对象转换成List集合
	 *
	 * @param json
	 * @return
	 */
	public static <T> List<T> toList(String json, Class<T> cls) {
		Gson gson = getGson();

		Type type = new TypeToken<List<JsonObject>>() {
		}.getType();

		List<JsonObject> jsonObjs = gson.fromJson(json, type);

		List<T> list = new ArrayList<T>();

		for (JsonObject jsonObj : jsonObjs) {
			list.add(gson.fromJson(jsonObj, cls));
		}

		return list;
	}

	public static void main(String[] args) {
		/*String json = "{\"front\": [{\"title\": \"企业名称\",\"andor\": \"and\",\"opertype\": \"in\",\"condname\": \"a.compcode\",\"type\": \"V\",\"value\": [\"compcode\"]},{\"title\": \"创建日期\",\"andor\": \"and\",\"opertype\": \"datebetween\",\"condname\": \"a.createdate\",\"type\": \"V\",\"value\": [\"createdateBegin\",\"createdateEnd\"]}],\"back\": {\"role\": {\"kefu\": \"and a.compcode in (select compcode from cmp_user_right where userid=#{userid})\",\"cangku\": \"and a.outwarehousecode in (select warehousecode from wh_user_right where userid=#{userid})\"},\"user\": {\"admin\": \"and 1=1\"}}}";
		ConditionVo vo = (ConditionVo) toObject(json,ConditionVo.class);
		System.out.println(vo);
		System.out.println(toString(vo));*/
//		String str = "[{\"code\":\"id\",\"title\":\"序号\"},{\"code\":\"code\",\"title\":12312}]";
//		List<Map<String,String>> list = (List<Map<String, String>>) toObject(str,List.class);\

//		String json = "[{\"userName\": \"企业名称\",\"password\": \"and\"},{\"userName\": \"企业名称1\",\"password\": \"and111\"}]";
//		String m=GsonUtil.getValueFromJson("view",json);
//		System.out.println(m);
//		System.out.println(GsonUtil.toListMap(json));
//		String json = "{\"userName\": \"企业名称\",\"password\": \"and\"}";
//		Map m=toMap(parseJson(json));
//		String s=(String) m.get("view");
//		System.out.println(s);
//		Gson gson=new Gson();//创建一个JsonParser
//		JsonParser parser = new JsonParser();

		//通过JsonParser对象可以把json格式的字符串解析成一个JsonElement对象
//		JsonElement el = parser.parse(json);
//		JsonArray jsonArray = null;
//		if(el.isJsonArray()){
//			jsonArray = el.getAsJsonArray();
//		}
//		System.out.println(jsonArray);
//		List<SendEmailParam> obj = (List<SendEmailParam>) toList(json);
//		System.out.println(obj);
		//UeqQRCode.getInstance().encoderQRCode("1231231", "d:\\test1.png");
//		String s="{\"alibaba_aliqin_fc_sms_num_send_response\":{\"result\":{\"err_code\":\"0\",\"model\":\"134523^4351232\",\"success\":false,\"msg\":\"成功\"}}}";
//		Map m1=toMap(s);
//		Map result=(Map)m1.get("alibaba_aliqin_fc_sms_num_send_response");

//		Map s2=(Map)result.get("result");
//		System.out.println(s2);

//		ConditionVo vo=new ConditionVo();

//		BackVo back=new BackVo();

//		back.setOrderby("order by d.createdate");

//		vo.setBack(back);

//		System.out.println(toString(vo));
//		for(int i=0;i<100;i++) {
//			Map<String, Object> map = new HashMap<String, Object>();
//			Long num=17071709310409939L;
//			map.put("orderid", num);
//			System.out.println(toString(map));
//		}
		String param = "{'orderid':17071709310409939}";
		String map = GsonUtil.toString(param);
		System.out.println(map);
	}

}
